package inject

import (
	"reflect"

	"gitee.com/knowgo/ego/egoc"
)

// Injector 注入结构
type Injector struct {
	Type                  reflect.Type  // 注入类型，即注入函数返回的类型
	Func                  reflect.Value // 注入函数实例
	ArgIsPtr              bool          // 参数是否指针
	returnTypeIsInterface bool          // 返回值是否是接口类型
	returnTypeIsPtr       bool          // 返回的数据类型是接口
	// AccessController      bool          // 兼顾权限控制的注入
}

// Create 返回值永远是指针类型
func (i *Injector) Create(ctx *egoc.Context) (reflect.Value, error) {
	var arg = reflect.ValueOf(ctx)
	if !i.ArgIsPtr {
		arg = arg.Elem()
	}
	res := i.Func.Call([]reflect.Value{arg})
	if res[1].IsNil() {
		if i.returnTypeIsPtr || i.returnTypeIsInterface {
			return res[0], nil
		}
		return res[0].Addr(), nil
	}

	// res[0].Pointer()
	return res[0], res[1].Interface().(error)
}
